package com.xie.leetcode.math;

//335. 路径交叉
//        给你一个整数数组 distance 。
//
//        从 X-Y 平面上的点 (0,0) 开始，先向北移动 distance[0] 米，然后向西移动 distance[1] 米，向南移动 distance[2] 米，向东移动 distance[3] 米，持续移动。也就是说，每次移动后你的方位会发生逆时针变化。
//
//        判断你所经过的路径是否相交。如果相交，返回 true ；否则，返回 false 。
//
//
//
//        示例 1：
//
//
//        输入：distance = [2,1,1,2]
//        输出：true
//        示例 2：
//
//
//        输入：distance = [1,2,3,4]
//        输出：false
//        示例 3：
//
//
//        输入：distance = [1,1,1,1]
//        输出：true
//
//
//        提示：
//
//        1 <= distance.length <= 105
//        1 <= distance[i] <= 105

/**
 * @author xiezhendong
 * @date 2021/10/29
 */
public class IsSelfCrossing {

    public static void main(String[] args) {
        IsSelfCrossing isSelfCrossing = new IsSelfCrossing();
        System.out.println(isSelfCrossing.isSelfCrossing(new int[]{2, 1, 1, 2}) + "   :   " + true);
        System.out.println(isSelfCrossing.isSelfCrossing(new int[]{1, 2, 3, 4}) + "   :   " + false);
        System.out.println(isSelfCrossing.isSelfCrossing(new int[]{1, 1, 1, 1}) + "   :   " + true);
        System.out.println(isSelfCrossing.isSelfCrossing(new int[]{3, 3, 4, 2, 2}) + "   :   " + false);
        System.out.println(isSelfCrossing.isSelfCrossing(new int[]{1, 1, 2, 1, 1}) + "   :   " + true);
        System.out.println(isSelfCrossing.isSelfCrossing(new int[]{3, 3, 3, 2, 1, 1}) + "   :   " + false);
        System.out.println(isSelfCrossing.isSelfCrossing(new int[]{1, 1, 2, 2, 1, 1}) + "   :   " + true);
    }

    public boolean isSelfCrossing(int[] distance) {
        int distanceLength = distance.length;
        if (distanceLength < 4) {
            return false;
        }
        for (int i = 4; i <= distanceLength; i++) {
            if (i >= 4) {
                int l4 = distance[i - 4];
                int l3 = distance[i - 3];
                int l2 = distance[i - 2];
                int l1 = distance[i - 1];
                if (l4 >= l2 && l1 >= l3) {
                    return true;
                }
                if (i == 5) {
                    if (l4 == l2) {
                        int l5 = distance[i - 5];
                        if (l5 + l1 >= l3) {
                            return true;
                        }
                    }
                }
                if (i > 5) {
                    if (l4 >= l2) {
                        int l5 = distance[i - 5];
                        if (l5 > l3) {
                            if (l1 >= l3) {
                                return true;
                            }
                        } else {
                            int l6 = distance[i - 6];
                            if (l5 + l1 >= l3 && l6 + l2 >= l4) {
                                return true;
                            }
                        }
                    }
                }
            }
        }
        return false;
    }
}
